import asyncio
import logging
from builtins import anext
from datetime import datetime, timedelta
from sqlalchemy.ext.asyncio import AsyncSession
from config.database import AsyncSessionLocal
from module_kylin.service.future_settlement_service import FutureSettlementService
from module_kylin.entity.vo.future_settlement_vo import (
    BatchFutureSettlementDownloadModel,
)

# 配置日志
logger = logging.getLogger(__name__)


async def download_future_settlement_daily_task():
    """
    定时批量下载期货结算单任务
    功能：判断今天是否是交易日，如果是则批量下载期货结算单
    选项：账户代码：全部，日期：今天，结算单类型：日报，利润计算类型：全部
    下载结算单时，如果有"已下载"，"已导入"状态的结算单则略过
    """
    logger.info("开始执行定时批量下载期货结算单任务")

    # 创建异步数据库会话
    try:
        # 直接创建数据库会话，避免使用异步生成器可能带来的循环问题
        async with AsyncSessionLocal() as db:
            try:
                # 1. 设置下载参数
                today = datetime.now().date()
                download_model = BatchFutureSettlementDownloadModel(
                    accountCodes=[],  # 空列表表示全部账户（使用驼峰命名法）
                    beginDate=today,
                    endDate=today,
                    settlementTypes=["D"],  # D表示日报
                    profitCalcTypes=[
                        "day",
                        "trade",
                    ],  # 同时包含逐日盯市和逐笔对冲两种利润计算类型
                )

                # 2. 执行批量下载
                result = await FutureSettlementService.batch_download_settlement(
                    db, download_model
                )

                # 3. 记录执行结果
                logger.info(f"定时批量下载期货结算单任务执行完成")
                logger.info(f"总任务数: {result.get('total_tasks', 0)}")
                logger.info(f"成功数: {result.get('success_count', 0)}")
                logger.info(f"跳过数: {result.get('skip_count', 0)}")
                logger.info(f"失败数: {result.get('fail_count', 0)}")

                # 记录失败消息（如果有）
                if result.get("fail_messages"):
                    logger.error(f"失败消息: {result['fail_messages']}")

            except Exception as e:
                logger.error(
                    f"定时批量下载期货结算单任务执行异常: {str(e)}", exc_info=True
                )
    except Exception as e:
        logger.error(f"定时批量下载期货结算单任务执行异常: {str(e)}", exc_info=True)

    logger.info("定时批量下载期货结算单任务结束")


# 注意：不再需要同步包装函数，直接使用异步函数即可
# 调度器会自动识别异步函数并使用合适的执行器
# def download_future_settlement_daily_task_sync():
#     """
#     同步版本的定时任务入口，供APScheduler调用
#     """
#     asyncio.run(download_future_settlement_daily_task())
